A class method to introspect delegated types, schema_dump configuration via DATABASE_URL, etc | This Week in Rails
https://world.hey.com/this.week.in.rails/a-class-method-to-introspect-delegated-types-schema_dump-configuration-via-database_url-etc-5c24eb60
Define a class method to introspect valid delegatable types so they can by jprosevear · Pull Request #50662 · rails/rails
ActiveRecordに関する修正です
ActiveRecord::DelegatedType にクラスメソッドとして <role>_types を実装しています
前提として delegeted types にあまり詳しくないので調べます
https://api.rubyonrails.org/classes/ActiveRecord/DelegatedType.html#method-i-delegated_type
delegated_type(role, types:, **options)
igaiga555さんがまとめてくださってた
ActiveRecord Delegated Type|Railsの練習帳
複数モデルのオブジェクト、複数テーブルのレコードを統一的に扱いたいケースがあります。たとえば、コメントモデルとメッセージモデルのレコード群を足し合わせたものから最新レコード3つを取得したいようなケースです。
Rails6.1で導入されたDelegated Typeはこのような状況でつかえます。
めちゃくちゃわかりやすい、ラブです
次のようなモデル群があるとします。
Commentモデル(contentカラムを持つ)
Messageモデル(subject, bodyカラムを持つ)
これらを統一的に扱う統合クラスであるEntryモデルをDelegated Typeをつかって実装します。
ふむふむ
たとえば、「CommentモデルとMessageモデルのレコード群を足し合わせたものから最新レコード3つを取得」するときに Entry.last(3) で取得できるようにします。
便利ですね
このプルリクでは、 delegated_type に指定したロールのタイプ(アサインされうるインスタンスのクラス名)を配列で返します
code:rb
class Entry < ActiveRecord::Base
delegated_type :entryable, types: %w Message Comment
end
Entry.entryable_types # => "Message", "Comment"
いままでこのメソッドなかったんですね、意外
ドキュメントにミスがあったのでプルリクを出してみました
ci skip docs: fix Entry#entryable_types to Entry.entryable_types by tanaken0515 · Pull Request #50819 · rails/rails · GitHub
マージされた!